package com.meiji.toutiao.util;

import android.support.annotation.NonNull;
import android.support.v7.util.DiffUtil;

import me.drakeet.multitype.Items;
import me.drakeet.multitype.MultiTypeAdapter;

/**
 * Created by Meiji on 2017/4/18.
 * multity  的difiUtilS 主要是对比变化的，更新adapter，继承系统自带的DiffUtil.Callback接口
 */

public class DiffCallback extends DiffUtil.Callback {

    private final Items mOldItems, mNewItems;   // 旧数据的list,新数据list

    /**
     * 构造函数
     * @param oldItems  旧数据
     * @param mNewItems 新数据
     */
    private DiffCallback(Items oldItems, Items mNewItems) {
        this.mOldItems = oldItems;
        this.mNewItems = mNewItems;
    }

    /**
     * 提供给外面使用的静态方法：这个方法中直接设置了recycleview的 diff 方法的设置步骤。
     * 使用recycleview 更新数据--只更新数据改变的数据
     * @param oldList  旧的数据list
     * @param newList  新数据list
     * @param adapter  适配器
     */
    public static void create(@NonNull Items oldList, @NonNull Items newList, @NonNull MultiTypeAdapter adapter) {

        DiffCallback diffCallback = new DiffCallback(oldList, newList);
        DiffUtil.DiffResult result = DiffUtil.calculateDiff(diffCallback, true);   // 这三句就是固定的模式
        result.dispatchUpdatesTo(adapter);
    }

    @Override
    public int getOldListSize() {
        return mOldItems != null ? mOldItems.size() : 0;
    }  // 旧数据的大小

    @Override
    public int getNewListSize() {
        return mNewItems != null ? mNewItems.size() : 0;
    }  // 新数据的大小

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {     // 先判断是否是同一个类型的数据
        return mOldItems.get(oldItemPosition).equals(mNewItems.get(newItemPosition));
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {  //如果是同一个类型的数据，在判断是否是同样的内容
        return mOldItems.get(oldItemPosition).hashCode() == mNewItems.get(newItemPosition).hashCode();
    }
}
